core: Deduplicate code converting struct stat -> GFileInfo
authorColin Walters <walters@verbum.org>
Wed, 17 Dec 2014 02:14:10 +0000 (21:14 -0500)
committerColin Walters <walters@verbum.org>
Fri, 19 Dec 2014 15:18:59 +0000 (10:18 -0500)
We were doing the same thing in a number of places, make a helper
function.

src/libostree/ostree-core-private.h
src/libostree/ostree-core.c
src/libostree/ostree-repo-libarchive.c
src/libostree/ostree-repo.c

index 851e74b1d7b4bea3fa7dd2a3407b71e7e69234be..294edfa5f4b77ddc0d8c288b4bf8b21c8eee925a 100644 (file)
@@ -81,6 +81,8 @@ _ostree_make_temporary_symlink_at (int             tmp_dirfd,
                                    GCancellable   *cancellable,
                                    GError        **error);
 
+GFileInfo * _ostree_header_gfile_info_new (mode_t mode, uid_t uid, gid_t gid);
+
 /* XX + / + checksum-2 + . + extension, but let's just use 256 for a
  * bit of overkill.
  */
index b8fa114a46f1ce8b9235b30ebd32d5ea20661ba7..78dd7112fe9c5cc4263b94b2cd6fbe17282946b2 100644 (file)
@@ -1264,6 +1264,31 @@ _ostree_loose_path (char              *buf,
   _ostree_loose_path_with_suffix (buf, checksum, objtype, mode, "");
 }
 
+/**
+ * _ostree_header_gfile_info_new:
+ * @mode: File mode
+ * @uid: File uid
+ * @gid: File gid
+ *
+ * OSTree only stores a subset of file attributes; for example,
+ * timestamps are intentionally not stored.  This function creates a
+ * #GFileInfo based on the attributes of a `struct stat` that match
+ * those file attributes.
+ *
+ * Returns: (transfer full): A new #GFileInfo mapping a subset of @stbuf.
+ */
+GFileInfo *
+_ostree_header_gfile_info_new (mode_t mode, uid_t uid, gid_t gid)
+{
+  GFileInfo *ret = g_file_info_new ();
+  g_file_info_set_attribute_uint32 (ret, "standard::type", ot_gfile_type_for_mode (mode));
+  g_file_info_set_attribute_boolean (ret, "standard::is-symlink", S_ISLNK (mode));
+  g_file_info_set_attribute_uint32 (ret, "unix::uid", uid);
+  g_file_info_set_attribute_uint32 (ret, "unix::gid", gid);
+  g_file_info_set_attribute_uint32 (ret, "unix::mode", mode);
+  return ret;
+}
+
 /*
  * _ostree_loose_path_with_suffix:
  * @buf: Output buffer, must be _OSTREE_LOOSE_PATH_MAX in size
@@ -1367,12 +1392,7 @@ file_header_parse (GVariant         *metadata,
   mode = GUINT32_FROM_BE (mode);
   rdev = GUINT32_FROM_BE (rdev);
 
-  ret_file_info = g_file_info_new ();
-  g_file_info_set_attribute_uint32 (ret_file_info, "standard::type", ot_gfile_type_for_mode (mode));
-  g_file_info_set_attribute_boolean (ret_file_info, "standard::is-symlink", S_ISLNK (mode));
-  g_file_info_set_attribute_uint32 (ret_file_info, "unix::uid", uid);
-  g_file_info_set_attribute_uint32 (ret_file_info, "unix::gid", gid);
-  g_file_info_set_attribute_uint32 (ret_file_info, "unix::mode", mode);
+  ret_file_info = _ostree_header_gfile_info_new (mode, uid, gid);
 
   if (S_ISREG (mode))
     {
@@ -1423,19 +1443,13 @@ zlib_file_header_parse (GVariant         *metadata,
                  &uid, &gid, &mode, &rdev,
                  &symlink_target, &ret_xattrs);
 
-  size = GUINT64_FROM_BE (size);
   uid = GUINT32_FROM_BE (uid);
   gid = GUINT32_FROM_BE (gid);
   mode = GUINT32_FROM_BE (mode);
   rdev = GUINT32_FROM_BE (rdev);
+  ret_file_info = _ostree_header_gfile_info_new (mode, uid, gid);
 
-  ret_file_info = g_file_info_new ();
-  g_file_info_set_size (ret_file_info, size);
-  g_file_info_set_attribute_uint32 (ret_file_info, "standard::type", ot_gfile_type_for_mode (mode));
-  g_file_info_set_attribute_boolean (ret_file_info, "standard::is-symlink", S_ISLNK (mode));
-  g_file_info_set_attribute_uint32 (ret_file_info, "unix::uid", uid);
-  g_file_info_set_attribute_uint32 (ret_file_info, "unix::gid", gid);
-  g_file_info_set_attribute_uint32 (ret_file_info, "unix::mode", mode);
+  g_file_info_set_size (ret_file_info, GUINT64_FROM_BE (size));
 
   if (S_ISREG (mode))
     {
index 90517d2044203a9152abe018740df74eced656f0..e25d6231a4a06d8a7150fd1b007332d7d03f68bb 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "config.h"
 
+#include "ostree-core-private.h"
 #include "ostree-repo-private.h"
 #include "ostree-mutable-tree.h"
 
@@ -48,19 +49,15 @@ file_info_from_archive_entry_and_modifier (OstreeRepo *repo,
                                            struct archive_entry *entry,
                                            OstreeRepoCommitModifier *modifier)
 {
-  gs_unref_object GFileInfo *info = g_file_info_new ();
+  gs_unref_object GFileInfo *info = NULL;
   GFileInfo *modified_info = NULL;
   const struct stat *st;
   guint32 file_type;
 
   st = archive_entry_stat (entry);
 
+  info = _ostree_header_gfile_info_new (st->st_mode, st->st_uid, st->st_gid);
   file_type = ot_gfile_type_for_mode (st->st_mode);
-  g_file_info_set_attribute_boolean (info, "standard::is-symlink", S_ISLNK (st->st_mode));
-  g_file_info_set_attribute_uint32 (info, "standard::type", file_type);
-  g_file_info_set_attribute_uint32 (info, "unix::uid", st->st_uid);
-  g_file_info_set_attribute_uint32 (info, "unix::gid", st->st_gid);
-  g_file_info_set_attribute_uint32 (info, "unix::mode", st->st_mode);
 
   if (file_type == G_FILE_TYPE_REGULAR)
     {
index 38471a6b8da64877b56abb1f1ac3fe1f5aeaf257..2d649aaeadd75a50034f330c805df965331af69a 100644 (file)
@@ -1802,11 +1802,10 @@ query_info_for_bare_content_object (OstreeRepo      *self,
       goto out;
     }
 
-  ret_info = g_file_info_new ();
+  ret_info = _ostree_header_gfile_info_new (stbuf.st_mode, stbuf.st_uid, stbuf.st_gid);
 
   if (S_ISREG (stbuf.st_mode))
     {
-      g_file_info_set_file_type (ret_info, G_FILE_TYPE_REGULAR);
       g_file_info_set_size (ret_info, stbuf.st_size);
     }
   else if (S_ISLNK (stbuf.st_mode))
@@ -1814,8 +1813,6 @@ query_info_for_bare_content_object (OstreeRepo      *self,
       char targetbuf[PATH_MAX+1];
       ssize_t len;
 
-      g_file_info_set_file_type (ret_info, G_FILE_TYPE_SYMBOLIC_LINK);
-      
       do
         len = readlinkat (self->objects_dir_fd, loose_path_buf, targetbuf, sizeof (targetbuf) - 1);
       while (G_UNLIKELY (len == -1 && errno == EINTR));
@@ -1834,11 +1831,6 @@ query_info_for_bare_content_object (OstreeRepo      *self,
       goto out;
     }
 
-  g_file_info_set_attribute_boolean (ret_info, "standard::is-symlink", S_ISLNK (stbuf.st_mode));
-  g_file_info_set_attribute_uint32 (ret_info, "unix::uid", stbuf.st_uid);
-  g_file_info_set_attribute_uint32 (ret_info, "unix::gid", stbuf.st_gid);
-  g_file_info_set_attribute_uint32 (ret_info, "unix::mode", stbuf.st_mode);
-
   ret = TRUE;
   gs_transfer_out_value (out_info, &ret_info);
  out: